/**
 * 实现断网重连
 * 具体使用方法 ：reduceRequest(异步请求)(请求参数,重连次数,每次重连间隔时间)
 *
 *
 * await 异步请求(请求参数)
 * await reduceRequest(getUserInfo)({id:1},{retryCount:1000,retryInterval:1000})
 *
 * 失败重连 :
 * 1. 失败的话 就不断的请求
 * 2. 如果成功就不再请求 并且返回成功的数据
 * 3. 重连的次数达到了 也不会再次请求
 * 4. 最开始需要执行一次
 */

export function reduceRequest(
  request: (...resetArgs: any[]) => Promise<any>
): (...args: any[]) => Promise<any> {
  return function (params, { retryCount = 10, retryInterval = 1000 } = {}) {
    return new Promise((resolve, reject) => {
      function executePromise(timer: NodeJS.Timer): Promise<any> {
        // 一系列的判断
        // 1. 如果没有重连次数 就不再重连
        if (retryCount <= 0) {
          clearInterval(timer);
          reject(new Error('重连次数到了'));
          return Promise.reject(new Error('重连次数达到了'));
        }
        // 2. 重连次数减一
        retryCount -= 1;
        // 3. 处理成功的情况
        return request(params)
          .then((res) => {
            // 定时器 清空
            clearInterval(timer);
            // 拿到成功的结果
            resolve(res);
          })
          .catch((e) => {
            // 如果失败了 就继续重连
            throw new Error(e);
          });
      }

      const timer = setInterval(() => {
        executePromise(timer);
      }, retryInterval);
      executePromise(timer);
    });
  };
}
